home *** CD-ROM | disk | FTP | other *** search
/ Shareware Grab Bag / Shareware Grab Bag.iso / 007 / bixdos.arc / ENV.ASM < prev    next >
Assembly Source File  |  1986-11-24  |  6KB  |  131 lines

  1. TITLE: MASM source for ENV.COM
  2.   This is the MASM source to create ENV.COM. The following commands are
  3. used to do it...
  4.     MASM env;
  5.     LINK env;
  6.     EXE2BIN env.exe env.com
  7.  
  8.   Source follows...
  9. -------------
  10. PAGE    64,132
  11. TITLE   ENV     5-30-86 [5-30-86]
  12. ;
  13. .RADIX  16
  14. CSEG    SEGMENT PARA PUBLIC 'CODE'
  15. ASSUME  DS:CSEG, SS:CSEG ,CS:CSEG ,ES:CSEG
  16.         ORG     0100
  17. START:  MOV     SI,80                           ;print the command line
  18.         LODSB                                     ;parameters
  19.         AND     AX,7F                             ;
  20.         JZ      L0117                             ;
  21.         MOV     DI,AX                             ;
  22.         ADD     DI,SI                             ;
  23.         MOV     BYTE PTR [DI],24                  ;
  24.         MOV     DX,SI                             ;
  25.         INC     DX                                ;
  26.         MOV     AH,9                              ;
  27.         INT     21                                ;
  28. L0117:  MOV     DX,OFFSET INPUT                 ;accept input into buffer
  29.         MOV     AH,0A                             ;
  30.         INT     21                                ;
  31.         CALL    L01A0                           ;this finds the environment!
  32.         MOV     CX,BX                           ;count
  33.         MOV     ES,AX                           ;segment of target
  34.         XOR     DI,DI                           ;offset of target
  35.         XOR     AL,AL                           ;looking for NUL
  36.         CLD                                     ;scan forward
  37. L012A:  REPNZ   SCASB                           ;do scan
  38.         JNZ     L016C                           ;not found -> exit with error
  39.         CMP     AL,ES:[DI]                      ;next byte NUL also? (end of
  40.         JZ      L0171                             ;environment) yes...
  41.         MOV     DX,DI                           ;no... save offset
  42.         MOV     BP,CX                           ;save count
  43.         MOV     SI,OFFSET RESULT                ;compare against...
  44.         MOV     CX,7                            ;comparing first 7 bytes
  45.         REPZ    CMPSB                           ;compare
  46.         JZ      L0147                           ;is it equal? yes...
  47.         MOV     DI,DX                           ;restore offset
  48.         MOV     CX,BP                           ;restore count
  49.         JMP     SHORT   L012A                   ;...and scan again
  50. L0147:  MOV     CX,51
  51.         REPNZ   SCASB
  52.         JNZ     L016C
  53.         MOV     SI,DI
  54.         MOV     DI,DX
  55.         MOV     CX,ES
  56.         MOV     DS,CX
  57.         MOV     CX,BX
  58.         SUB     CX,SI
  59. L015A:  LODSB
  60.         AND     AL,AL
  61.         JZ      L0171
  62. L015F:  STOSB
  63.         LOOP    L0164
  64.         JMP     SHORT   L016C
  65. L0164:  LODSB
  66.         AND     AL,AL
  67.         JNZ     L015F
  68.         STOSB
  69.         LOOP    L015A
  70. L016C:  MOV     AX,4C01                         ;exit with error
  71.         INT     21                                ;
  72. L0171:  MOV     BYTE PTR ES:[DI],0
  73.         MOV     AX,CS
  74.         MOV     DS,AX
  75.         MOV     AL,LENGTH
  76.         XOR     AH,AH
  77.         ADD     AX,8
  78.         ADD     AX,DI
  79.         CMP     AX,BX
  80.         JNB     L016C
  81.         MOV     SI,OFFSET RESULT
  82.         MOV     CX,7
  83.         REPZ    MOVSB
  84.         MOV     SI,OFFSET TEXT
  85.         MOV     CL,LENGTH
  86.         REPZ    MOVSB
  87.         XOR     AX,AX
  88.         STOSW
  89.         MOV     AX,4C00                         ;exit without error
  90.         INT     21                                ;
  91.  
  92. ;somehow, this proc finds the environment of the process that performs the
  93. ;  DOS critical error handler - this is the segment where the answer will
  94. ;  be placed    (AX has the segment, BX has (some) length...) (but I don't
  95. ;  know how it does it...)
  96. L01A0   PROC NEAR
  97.         PUSH    ES                              ;save es
  98.         MOV     AX,CS                           ;cs into es
  99.         MOV     ES,AX                             ;
  100.         MOV     AX,ES:14                        ;critical error exit segment
  101.         MOV     ES,AX                             ;into es
  102.         MOV     AX,ES:2C                        ;environment segment of the
  103.                                                   ;process doing the critical
  104.                                                   ;error handler!
  105.         AND     AX,AX                           ;is it zero?
  106.         JNZ     L01C0                             ;yes...
  107.         MOV     AX,ES                           ;this loads ax with the word
  108.         DEC     AX                                ;at offset 3 into the
  109.         MOV     ES,AX                             ;segment before the PSP of
  110.         ADD     AX,ES:3                           ;the critical error handler
  111.         ADD     AX,2                            ;add two
  112. L01C0:  DEC     AX                              ;subtract one
  113.         MOV     ES,AX                           ;load bx with the number of
  114.         INC     AX                                ;paragraphs within the
  115.         MOV     BX,ES:3                           ;environment segment
  116.         SHL     BX,1                            ;multiply by 10h
  117.         SHL     BX,1                              ;
  118.         SHL     BX,1                              ;
  119.         SHL     BX,1                              ;
  120.         POP     ES                              ;restore es
  121.         RET                                     ;and return
  122. L01A0   ENDP
  123.  
  124. INPUT   DB      50                              ;length of buffer
  125. LENGTH  DB      00                              ;spot for characters read
  126. TEXT    DB      50 DUP(00)                      ;the buffer
  127. RESULT: DB      'ANSWER=VER 1.00'               ;the default environ string
  128.         CSEG    ENDS
  129.  
  130. END     START
  131.